// useMqtt.js
import { ref, onUnmounted } from 'vue'; // 从Vue中引入ref和onUnmounted
import mqtt from 'mqtt'; // 引入mqtt库

export function useMqtt(brokerUrl) {
    // console.log(1);
    // clientId:'client_' + Math.random().toString(16).substr(2, 8),
    const client = mqtt.connect(brokerUrl); // 使用提供的broker URL和选项来连接MQTT代理
    const isConnected = ref(false); // 用来追踪连接状态的响应式引用
    // console.log(client.connect);
    client.on('connect', () => {
        isConnected.value = true; // 当连接成功时，设置为true
        // console.log(isConnected.value);
    });
    // console.log(2);
    client.on('disconnect', () => {
        // console.log(4);
        isConnected.value = false; // 当断开连接时，设置为false
    });

    client.on('error', (error) => {
        console.error(`MQTT connection error: ${error}`); // 控制台打印错误
        isConnected.value = false; // 出错时设置连接状态为false
        client.end(); // 并结束该MQTT客户端
    });

    onUnmounted(() => {
        if (client) {
            client.end(); // 当Vue组件卸载时，结束MQTT客户端
        }
    });

    function publish(topic, message, opts = {}) {
        if (isConnected.value) {
            client.publish(topic, message, opts); // 如果已连接，则发布消息到指定主题
        }
    }
    function subscribe(topic, callback) {

        client.subscribe(topic, (err, granted) => {
            // 如果已连接，则订阅指定主题
            if (err) {
                console.error(`Subscribe error: ${err}`); // 若有错误，打印错误
            } else {
                client.on('message', (receivedTopic, message) => {
                    // 每当收到消息时执行以下代码
                    callback(receivedTopic, message); // 如果消息为订阅主题，则执行回调函数
                    // }
                });
            }
        });
    }


    return { client, isConnected, publish, subscribe };
    // 返回mqtt客户端、连接状态、发布和订阅方法
}
